/*
 * Inicializacion.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 24/04/2011, 12:58:35 AM
 */

package com.ufps.cuatro.modelo.representacion;

import com.ufps.cuatro.modelo.representacion.componente.Componente;
import com.ufps.cuatro.util.Utileria;
import java.util.ArrayList;
import com.ufps.cuatro.util.base.ObjectBase;

/**
 * <i><b>Inicializacion:</b></i><p>Las Inicializaciones son Propiedades de Componentes
 * que se configuran con valores por defecto al momento de crearse.</p>
 * <p>Las Inicializaciones estan configuradas en un archivo de Propiedades y
 * pueden ser modificadas a los requerimientos del usuarios siempre y cuando
 * se respeten las reglas de creación definidas en el archivo.</p>
 * 
 * @param <T> Referencia al Componente padre.
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @see Componente
 * @see ObjectBase
 */
public class Inicializacion<T extends Componente> extends ObjectBase{
    private static final long serialVersionUID = 146491394125497991L;
    
    private int componente;
    private boolean generador;
    private int propiedad;    
    private T objComponente;
    private boolean bStatic = true;
    private ArrayList<ParametroInicializacion> objParametros;
    
    public final static String INIT_TITULO_ETIQUETA;
    
    static{
        INIT_TITULO_ETIQUETA = Utileria.leerRecursoTexto("Utileria.inicializacion.titulo").trim();
    }

    /**
     * Constructor por defecto
     */
    public Inicializacion() {
    }

    /**
     * Constructor que Inicializa propiedades Básicas.
     * @param id Propiedad utilizada para identificar el indice dentro de los archivos de
     * propiedades.
     * @param componente Referencia al Componente padre.
     * @param generador Indica si la Inicialización se Aplica al Componente Generador
     * del área de la GUI representada.
     * @param propiedad Indice que identifica la Propiedad Inicializada del Componente
     * Padre.
     * @param bStatic  
     */
    public Inicializacion(int id, int componente, boolean generador, int propiedad, boolean bStatic) {
        super(id);
        this.componente = componente;
        this.generador = generador;
        this.propiedad = propiedad;
        this.bStatic = bStatic;
    }
    
    /**
     * Constructor que Inicializa propiedades Básicas y asigna la Referencia del
     * Componente Padre.
     * @param objComponente Referencia al Componente padre.
     * @param id Propiedad utilizada para identificar el indice dentro de los archivos de
     * propiedades.
     * @param componente Indice del Componente.
     * @param generador Indica si la Inicialización se Aplica al Componente Generador
     * del área de la GUI representada.
     * @param propiedad Indica que identifica la Propiedad Inicializada del Componente
     * Padre.
     * @param bStatic  
     */
    public Inicializacion(T objComponente, int id, int componente, boolean generador, int propiedad, boolean bStatic) {
        super(id);
        this.objComponente = objComponente;
        this.componente = componente;
        this.generador = generador;
        this.propiedad = propiedad;
        this.bStatic = bStatic;
    }

    /**
     * Devuelve el Indice del Componente.
     * @return Indice del Componente.
     */
    public int getComponente() {
        return componente;
    }

    /**
     * Establece el Indice del Componente.
     * @param componente Indice del Componente.
     */
    public void setComponente(int componente) {
        this.componente = componente;
    }

    /**
     * Devuelve el Estado que Indica si la Inicialización se Aplica al Componente Generador
     * del área de la GUI representada.
     * @return Estado que Indica si la Inicialización se Aplica al Componente Generador
     * del área de la GUI representada.
     */
    public boolean isGenerador() {
        return generador;
    }

    /**
     * Establece el Estado que Indica si la Inicialización se Aplica al Componente Generador
     * del área de la GUI representada.
     * @param generador Estado que Indica si la Inicialización se Aplica al Componente Generador
     * del área de la GUI representada.
     */
    public void setGenerador(boolean generador) {
        this.generador = generador;
    }

    /**
     * Devuelve la Colección de Parametros que Configuran la Inicialización de
     * la Propiedad.
     * @return Colección de Parametros que Configuran la Inicialización de
     * la Propiedad.
     */
    public ArrayList<ParametroInicializacion> getObjParametros() {
        return objParametros;
    }

    /**
     * Establece la Colección de Parametros que Configuran la Inicialización de
     * la Propiedad.
     * @param objParametros Colección de Parametros que Configuran la Inicialización de
     * la Propiedad.
     */
    public void setObjParametros(ArrayList<ParametroInicializacion> objParametros) {
        this.objParametros = objParametros;
    }

    /**
     * Devuelve el Indice que identifica la Propiedad Inicializada del Componente
     * Padre.
     * @return Indice que identifica la Propiedad Inicializada del Componente
     * Padre.
     */
    public int getPropiedad() {
        return propiedad;
    }

    /**
     * Establece el Indice que identifica la Propiedad Inicializada del Componente
     * Padre.
     * @param propiedad Indice que identifica la Propiedad Inicializada del Componente
     * Padre.
     */
    public void setPropiedad(int propiedad) {
        this.propiedad = propiedad;
    }

    /**
     * Devuelve la Referencia al Componente Padre.
     * @return Referencia al Componente Padre.
     */
    public T getObjComponente() {
        return objComponente;
    }

    /**
     * Establece la Referencia al Componente Padre.
     * @param objComponente Referencia al Componente Padre.
     */
    public void setObjComponente(T objComponente) {
        this.objComponente = objComponente;
    }

    /**
     * 
     * @return
     */
    public boolean isbStatic() {
        return bStatic;
    }

    /**
     * 
     * @param bStatic
     */
    public void setbStatic(boolean bStatic) {
        this.bStatic = bStatic;
    }
    
    @Override
    public String toString() {                
        return String.valueOf(this.componente);
    }
    
    @Override
    public int compareTo(Object o) {        
        try{
            Inicializacion obj = (Inicializacion) o;
            if(this.id > obj.id) {
                return 1;
            }
            else if(this.id < obj.id) {
                return -1;
            }
            else {
                return 0;
            }
        }catch(java.lang.NullPointerException ex){}
        return 0;
    }

//    @Override
//    protected Object clone() {
//        Inicializacion objClon = null;        
//        //Primero se Clona la Referencia Local
//        objClon = (Inicializacion) super.clone();        
//        //Ahora se hace la Clonación Profunda
//        if(objComponente != null){
//            ((Inicializacion)objClon).setObjComponente((Componente) objComponente.clone());
//        }
//        if(objParametros != null){
//            ((Inicializacion)objClon).setObjParametros((ArrayList<ParametroInicializacion>) objParametros.clone());
//        }                
//        return objClon;
//    }
    
    
}
